import { ItemStack } from "@minecraft/server";
import { removeItemFromContainer, getEntityContainer } from "../utility/utilitys";
const honeyBarData = new Map();
export class RecipeProssesor {
    recipes;
    entity;
    recipe;
    inv;
    flag = true;
    finalOutputItems = [];
    constructor(recipes, entity) {
        this.recipes = recipes;
        this.entity = entity;
        this.inv = getEntityContainer(entity);
    }
    init(inputSlots, is_feedItem, feederItemsIds) {
        if (!this.flag)
            return this;
        this.finalOutputItems = this.getOutputItemThroughInpute(inputSlots, is_feedItem, feederItemsIds);
        return this;
    }
    addHoneyInHoneySlot(slotIndex) {
        if (!this.entity || !this.flag) {
            this.flag = false;
            return this;
        }
        ;
        let inv = getEntityContainer(this.entity);
        let { x, y, z } = this.entity.location;
        let key = `${Math.floor(x)},${Math.floor(y)},${Math.floor(z)},${this.entity.dimension.id}`;
        let honeyBarAmount = honeyBarData.get(key) ?? 0;
        let item = inv.getItem(slotIndex);
        let slot = inv.getSlot(slotIndex);
        if (!item) {
            slot.setItem(new ItemStack("minecraft:dirt"));
            honeyBarData.set(key, 0);
            return this;
        }
        else if (honeyBarAmount >= 5 && item.amount < 6) {
            item.amount += 1;
            slot.setItem(item);
            honeyBarData.set(key, 0);
        }
        else {
            honeyBarData.set(key, ++honeyBarAmount);
        }
        return this;
    }
    addHoneyToBottel(bottelSlotIndex, honeyBarSlotIndex) {
        if (!this.entity || !this.flag) {
            this.flag = false;
            return this;
        }
        ;
        let inv = getEntityContainer(this.entity);
        let item = inv.getItem(bottelSlotIndex);
        let honeyBerItem = inv.getItem(honeyBarSlotIndex);
        if ((!item || item.typeId !== "minecraft:glass_bottle") || (honeyBerItem?.amount ?? 0) !== 6 ||
            !this.hasItemAddToTheSlots("minecraft:honey_bottle", [0, 1, 2, 3, 4, 5, 6, 7, 8])) {
            this.flag = false;
            return this;
        }
        ;
        let slot = inv.getSlot(bottelSlotIndex);
        removeItemFromContainer(1, slot);
        honeyBerItem.amount = 1;
        inv.setItem(honeyBarSlotIndex, honeyBerItem);
        this.finalOutputItems.push({
            itemId: "minecraft:honey_bottle",
            count: 1
        });
        return this;
    }
    addItemInOutputSlots(outputSlots) {
        if (this.finalOutputItems.length === 0 || !this.flag) {
            this.flag = false;
            return this;
        }
        let inv = getEntityContainer(this.entity);
        for (let { itemId, count } of this.finalOutputItems) {
            for (let i of outputSlots) {
                let slot = inv.getSlot(i);
                if (!slot)
                    continue;
                let item = slot.getItem();
                if (!item || (item.typeId === itemId && item.amount < 64)) {
                    let amount = item ? item.amount : 0;
                    let newCount = Math.min(amount + count, 64);
                    let outputItem = new ItemStack(itemId, newCount);
                    slot.setItem(outputItem);
                    break;
                }
            }
        }
        return this;
    }
    hasItemAddToTheSlots(itemId, slotsIndex) {
        if (!this.entity)
            return false;
        let inv = getEntityContainer(this.entity);
        for (let i of slotsIndex) {
            let item = inv.getItem(i);
            if (!item || (item.typeId === itemId && item.amount < item.maxAmount))
                return true;
        }
        return false;
    }
    getOutputItemThroughInpute(inputSlots, is_feedItem, allowedBees) {
        if (!this.recipes || !this.flag) {
            this.flag = false;
            return;
        }
        let randomNumber = Math.floor(((Math.random()) * 100));
        let outputItemsWithCount = [];
        for (let { input, output } of this.recipes) {
            for (let i of inputSlots) {
                let item = getEntityContainer(this.entity)?.getItem(i);
                if (!item)
                    continue;
                if (item.typeId === input.itemId && (is_feedItem ? allowedBees.includes(item.typeId) : true)) {
                    if (randomNumber <= output.chance) {
                        let outputItem = { itemId: output.itemId, count: output.count };
                        outputItemsWithCount.push(outputItem);
                    }
                }
                continue;
            }
        }
        if (outputItemsWithCount.length === 0)
            return [];
        return outputItemsWithCount;
    }
}
export const advancedBeehive = [
    {
        input: { itemId: "um:iron_bee" },
        output: { itemId: "um:iron_comb", count: 3, chance: 99 }
    },
    {
        input: { itemId: "um:diamond_bee" },
        output: { itemId: "um:diamond_comb", count: 3, chance: 99 }
    },
    {
        input: { itemId: "um:gold_bee" },
        output: { itemId: "um:gold_comb", count: 3, chance: 99 }
    },
    {
        input: { itemId: "um:copper_bee" },
        output: { itemId: "um:copper_comb", count: 3, chance: 99 }
    },
    {
        input: { itemId: "um:netherite_bee" },
        output: { itemId: "um:netherite_comb", count: 3, chance: 99 }
    },
    {
        input: { itemId: "um:lapis_bee" },
        output: { itemId: "um:lapis_comb", count: 3, chance: 99 }
    },
    {
        input: { itemId: "um:redstone_bee" },
        output: { itemId: "um:redstone_comb", count: 3, chance: 99 }
    },
    {
        input: { itemId: "um:bee" },
        output: { itemId: "minecraft:honeycomb", count: 3, chance: 99 }
    }
];
export const centrifugeRecipe = [
    {
        input: { itemId: "um:diamond_comb" },
        output: {
            items: [
                {
                    itemId: "minecraft:diamond",
                    count: 1,
                    chance: 30
                },
                {
                    itemId: "um:wax",
                    count: 1,
                    chance: 99
                }
            ]
        }
    },
    {
        input: { itemId: "um:iron_comb" },
        output: {
            items: [
                {
                    itemId: "minecraft:raw_iron",
                    count: 1,
                    chance: 40
                },
                {
                    itemId: "um:wax",
                    count: 1,
                    chance: 99
                }
            ]
        }
    },
    {
        input: { itemId: "um:copper_comb" },
        output: {
            items: [
                {
                    itemId: "minecraft:raw_copper",
                    count: 1,
                    chance: 40
                },
                {
                    itemId: "um:wax",
                    count: 1,
                    chance: 99
                }
            ]
        }
    },
    {
        input: { itemId: "um:gold_comb" },
        output: {
            items: [
                {
                    itemId: "minecraft:raw_gold",
                    count: 1,
                    chance: 40
                },
                {
                    itemId: "um:wax",
                    count: 1,
                    chance: 99
                }
            ]
        }
    },
    {
        input: { itemId: "um:netherite_comb" },
        output: {
            items: [
                {
                    itemId: "minecraft:netherite_scrap",
                    count: 1,
                    chance: 10
                },
                {
                    itemId: "um:wax",
                    count: 1,
                    chance: 99
                }
            ]
        }
    },
    {
        input: { itemId: "um:lapis_comb" },
        output: {
            items: [
                {
                    itemId: "minecraft:lapis_lazuli",
                    count: 1,
                    chance: 50
                },
                {
                    itemId: "um:wax",
                    count: 1,
                    chance: 99
                }
            ]
        }
    },
    {
        input: { itemId: "um:redstone_comb" },
        output: {
            items: [
                {
                    itemId: "minecraft:redstone",
                    count: 2,
                    chance: 99
                },
                {
                    itemId: "um:wax",
                    count: 1,
                    chance: 99
                }
            ]
        }
    },
    {
        input: { itemId: "minecraft:honeycomb" },
        output: {
            items: [
                {
                    itemId: "um:wax",
                    count: 1,
                    chance: 99
                }
            ]
        }
    }
];
